package org.example.SFTP;

import com.jcraft.jsch.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class SftpFileUploader {
    
    // SFTP服务器连接信息
    private static final String SFTP_HOST = "localhost"; // 服务器地址
    private static final int SFTP_PORT = 22; // 端口号，默认22
    private static final String SFTP_USER = "sftpuser"; // 用户名
    private static final String SFTP_PASSWORD = "ZHa123456789."; // 密码
    
    // 本地文件路径和远程保存路径
    private static final String LOCAL_FILE_PATH = "C:/test/upload_test.txt"; // 要上传的本地文件
    private static final String REMOTE_FILE_PATH = "/"; // 远程服务器保存目录
    
    public static void main(String[] args) {
        Session session = null;
        Channel channel = null;
        
        try {
            // 创建JSch对象
            JSch jsch = new JSch();
            
            // 获取Session对象
            session = jsch.getSession(SFTP_USER, SFTP_HOST, SFTP_PORT);
            session.setPassword(SFTP_PASSWORD);
            
            // 配置连接属性
            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no"); // 不检查主机密钥
            session.setConfig(config);
            
            // 连接到服务器
            System.out.println("连接到SFTP服务器...");
            session.connect();
            System.out.println("成功连接到SFTP服务器");
            
            // 打开SFTP通道
            channel = session.openChannel("sftp");
            channel.connect();
            ChannelSftp sftpChannel = (ChannelSftp) channel;
            System.out.println("SFTP通道已打开");
            
            // 检查本地文件是否存在
            File localFile = new File(LOCAL_FILE_PATH);
            if (!localFile.exists()) {
                throw new IOException("本地文件不存在: " + LOCAL_FILE_PATH);
            }
            
            // 上传文件
            System.out.println("开始上传文件: " + localFile.getName());
            try (InputStream inputStream = new FileInputStream(localFile)) {
                sftpChannel.put(inputStream, REMOTE_FILE_PATH + localFile.getName());
            }
            System.out.println("文件上传成功！");
            
            // 验证文件是否上传成功
            System.out.println("验证文件是否存在...");
            sftpChannel.ls(REMOTE_FILE_PATH + localFile.getName());
            System.out.println("文件已成功上传到远程服务器");
            
        } catch (JSchException | SftpException | IOException e) {
            System.err.println("SFTP操作失败: " + e.getMessage());
            e.printStackTrace();
        } finally {
            // 关闭连接
            if (channel != null && channel.isConnected()) {
                channel.disconnect();
                System.out.println("SFTP通道已关闭");
            }
            if (session != null && session.isConnected()) {
                session.disconnect();
                System.out.println("SFTP会话已关闭");
            }
        }
    }
}
